Technical Q&A QA1150
Movie Drawing Complete Procedure with C++


Q: ÉÄÅ[ÉrÅ[ï`âÊäÆóπÉvÉçÉVÅ[ÉWÉÉÇΔǵǃ C++ ÉNÉâÉXÇÃÉCÉìÉXÉ^ÉìÉXÉÅÉ\ÉbÉhÇégǮǧÇΔǵǃǢNjÇ∑ÅBDZÇÍÇçsǧÇΩÇflÇÃï˚ñ@ÇÕdžÇËÇ‹Ç∑Ç©ÅHâΩÇ©êÑèßÇ∑ÇÈï˚ñ@ǙdžÇËÇ‹Ç∑Ç©ÅH Ç«ÇÃÉÄÅ[ÉrÅ[ÅiéÑÇÃÉIÉuÉWÉFÉNÉgÅjÇ™ÉtÉåÅ[ÉÄÇï`âÊǵǃǢÇÈÇ©ÇímÇËÇΩÇ¢ÇÃÇ≈Ç∑ÅB

A: ï`âÊäÆóπä÷êîÇÉÄÅ[ÉrÅ[Ç…äÑÇËìñǃÇÈÇ…ÇÕÅASetMovieDrawingCompleteProc ÇÃåƒÇ—èoǵÇégǢNjÇ∑ÅBDZÇÃåƒÇ—èoǵÇÕÅAÉÄÅ[ÉrÅ[ÅAÉtÉâÉOÅimovieDrawingCallWhenChanged Ç‹ÇΩÇÕ movieDrawingCallAlwaysÅjÅAÉRÅ[ÉãÉoÉbÉNÇéwÇ∑ÇΩÇflÇà UPPÅAÇ®ÇÊÇ— RefCon Çà¯êîÇΔǵǃéÊÇËÇ‹Ç∑ÅBMovieDrawingCompleteProc ÇÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈÇΔÇ´ÇÕÅAMovieDrawingCompleteUPP ÇÅAÉNÉâÉXÇÃÉÅÉìÉoä÷êîÇ≈ÇÕÇ»Ç≠ê√ìIÇ»ÉNÉâÉXä÷êîÇ…ëŒÇµÇƒégǢNjÇ∑ÅBRefCon ÇégǡǃÅAÉNÉâÉXÇÃÉCÉìÉXÉ^ÉìÉXÇéQèΔÇ≈Ç´Ç‹Ç∑ÅB


// Example ÉNÉâÉXÇÃÉwÉbÉ_ÉtÉ@ÉCÉã
// MyClass.h
class MyClass {
public:
            MyClass() { mMovie = NULL; };
    virtual ~MyClass();

protected:
            void  InstallMovieDrawingComplete(Movie inMovie,
                                     long inFlags = movieDrawingCallAlways);
    virtual OSErr DrawingCompleteDoSomething(Movie theMovie) { return noErr; };

private:
    /*  ÉÄÅ[ÉrÅ[ï`âÊÇÃäÆóπéûÇ…åƒÇ—èoÇ≥ÇÍÇÈ
        typedef OSErr (*MovieDrawingCompleteProcPtr) (Movie theMovie, long refCon);
     */
    static pascal OSErr MyClassMovieDrawingCompleteProc(Movie theMovie, long refCon);
    static MovieDrawingCompleteUPP sMovieDrawingCompleteUPP;
           Movie                   mMovie;
};

// Example ÉNÉâÉXÇÃé¿ëï
// MyClass.cpp

MovieDrawingCompleteUPP MyClass::sMovieDrawingCompleteUPP = NULL;

pascal OSErr MyClass::MyClassMovieDrawingCompleteProc(Movie theMovie, long refCon)
{
    MyClass *instance = reinterpret_cast<MyClass *>(refCon);
    OSErr err = noErr;

    if (instance)
        err = instance->DrawingCompleteDoSomething(theMovie);

    return err;
}

MyClass::~MyClass()
{
    if (mMovie) ::SetMovieDrawingCompleteProc(mMovie, 0, NULL, 0L);
    if (sMovieDrawingCompleteUPP)
        ::DisposeMovieDrawingCompleteUPP(sMovieDrawingCompleteUPP);
}

/*
   inFlags: movieDrawingCallWhenChanged
                ÉÄÅ[ÉrÅ[Ç™ïœçXÇ≥ÇÍÇΩÇΔÇ´ÇÃÇ›ÅAÉcÅ[ÉãÉ{ÉbÉNÉXÇ™ï`âÊäÆóπä÷êîÇåƒÇ—èoÇ∑ÇÊǧDžéwíËÇ∑ÇÈ
            movieDrawingCallAlways
                ÉcÅ[ÉãÉ{ÉbÉNÉXÇ…ëŒÇµÇƒÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ MoviesTask ÇåƒÇ—èoÇ∑ÇΩÇ—Ç…ï`âÊäÆóπä÷êîÇåƒÇ—èoÇ∑ÇÊǧDžéwíËÇ∑ÇÈ
 */
void MyClass::InstallMovieDrawingComplete(Movie inMovie, long inFlags)
{
    if (NULL == MyClass::sMovieDrawingCompleteUPP) {
        MyClass::sMovieDrawingCompleteUPP =
                 ::NewMovieDrawingCompleteUPP(MyClass::MyClassMovieDrawingCompleteProc);
    }

    if (inMovie) {
        if (mMovie) {
            // ëOÇÃÉÄÅ[ÉrÅ[ÇÃÉRÅ[ÉãÉoÉbÉNÇéÊÇËèúÇ≠
            ::SetMovieDrawingCompleteProc(mMovie, 0, NULL, 0L);
        }
        ::SetMovieDrawingCompleteProc(inMovie, inFlags,
                                      MyClass::sMovieDrawingCompleteUPP,
                                      long(this));
        mMovie = inMovie;
   }
}

ÉäÉXÉg 1 MovieDrawingCompleteProc Ç…ê√ìIÇ»ÉÅÉìÉoÇégóp


[2002 îN 6 åé 18 ì˙]